﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace FrbaCommerce.Editar_Publicacion
{
    public partial class FormEditarPubl : Form
    {
        private string tipo, estado;
        private int user_id, pub_cod, stockAnterior;


        Editar_Publicacion.Listado formPadre;

        public FormEditarPubl(int usuario, DataGridViewRow fila, Editar_Publicacion.Listado formPadre)
        {
            InitializeComponent();
            this.user_id = usuario;
            cargarDatos(fila);
            this.formPadre = formPadre;
            comboBoxEstado.SelectedIndex = 0;
            comboBoxVisib.SelectedIndex = 0;
            monthCalendar.TodayDate = Program.FechaActual;
            monthCalendar.SelectionStart = Program.FechaActual;

        }

        private void cargarDatos(DataGridViewRow fila)
        {
            pub_cod = Convert.ToInt32(fila.Cells["Código"].Value.ToString());
            textBoxDesc.Text = fila.Cells["Descripción"].Value.ToString();
            mTBStock.Text = fila.Cells["Stock"].Value.ToString();
            stockAnterior = Convert.ToInt32(fila.Cells["Stock"].Value);
            mTBFechaInicio.Text = fila.Cells["Fecha Inicio"].Value.ToString();
            mTBFechaVencimiento.Text = fila.Cells["Fecha Vencimiento"].Value.ToString();
            mTBPrecio.Text = Convert.ToDouble(fila.Cells["Precio"].Value).ToString("000000.00");
            checkBoxPP.Checked = (bool)fila.Cells["Permite Preguntas"].Value;
            comboBoxVisib.Text = fila.Cells["Visibilidad"].Value.ToString();
            estado = comboBoxEstado.Text = fila.Cells["Estado"].Value.ToString();
            tipo = fila.Cells["Tipo"].Value.ToString();

            Generar_Publicacion.GenerarPublicacion pub = new Generar_Publicacion.GenerarPublicacion(user_id);
            pub.CargarEstados(comboBoxEstado);
            pub.CargarVisibilidades(comboBoxVisib);
            pub.CargarRubros(listBoxRubros);

            actualizarRubros();
          
        }

        private void actualizarRubros(){

            SqlConnection con = Program.obtenerConexion();

            SqlCommand leerRub_Pub = new SqlCommand("SELECT rp_rub_id, rp_pub_id FROM Monkey_Coders.Rubros_publicaciones"
            +" WHERE rp_pub_id = " + pub_cod, con);
            SqlDataReader lector = leerRub_Pub.ExecuteReader();

            ListBox.ObjectCollection rubrosBackup = new ListBox.ObjectCollection(listBoxRubros, listBoxRubros.Items);

            if (lector.HasRows)
            {
                while (lector.Read())
                {
                    foreach (Generar_Publicacion.GenerarPublicacion.Rubro rubro in rubrosBackup)
                    {
                        if (rubro.id == Convert.ToInt32(lector["rp_rub_id"]))
                        {
                            listBoxRubrosFinal.Items.Add(rubro);
                            listBoxRubros.Items.Remove(rubro);
                        }
                        
                    }
                }
            }
        
        }

        private void loadPublicada()
        {
            
            panelEstado.Visible = true;
            /*buttonEditar.Bounds = new Rectangle(buttonEditar.Bounds.X,panelEstado.Bounds.Bottom + buttonEditar.Bounds.Height,buttonEditar.Bounds.Width,buttonEditar.Bounds.Height);
            
            // Resize del form
            Rectangle r = this.ClientRectangle;
            r.Inflate(0, -(this.Location.Y - buttonEditar.Bounds.Y));
            this.Bounds = this.RectangleToScreen(r);*/

            //Saco la opción de ponerla en borrador
            comboBoxEstado.Items.RemoveAt(1);
        }

        private void loadBorrador()
        {
            panelEstado.Visible = true;
            panelStock.Visible = true;
            panelBorrada.Visible = true;
        }

        private void loadFinalizada()
        { 
            //Las publicaciones finalizadas no pueden ser modificadas
            MessageBox.Show("Las publicaciones finalizadas no pueden ser modificadas","FRBA-Commerce",MessageBoxButtons.OK,MessageBoxIcon.Warning);
            this.Close();
        }

        private void FormEditarPubl_Load(object sender, EventArgs e)
        {

            //Si es admin que haga lo que quiera.
            if (AccessData.adRol.obtenerRolusuario(user_id) == 1)
            {
                loadBorrador();
                return;
            }

            if (tipo.Equals("Compra Inmediata"))
                panelStock.Visible = true;
            else
                if (estado == "Publicada")
                {
                    MessageBox.Show("No se pueden modificar las subastas ya publicadas", "FRBA - Commerce", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    this.Close();
                    return;
                }

            switch(estado){
                case "Publicada":
                    loadPublicada();
                    break;
                case "Borrador":
                    loadBorrador();
                    break;
               case "Pausada":
                    loadPublicada(); //La tratamos igual que a una publicada, solo que en el estado Pausada no es comprable
                    break;
                case "Finalizada":
                    loadFinalizada();
                    break;
            }

        }

        private void radioButtonCI_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void panelBorrada_Paint(object sender, PaintEventArgs e)
        {

        }

        private void buttonEditar_Click(object sender, EventArgs e)
        {
            Generar_Publicacion.GenerarPublicacion publicacion = new FrbaCommerce.Generar_Publicacion.GenerarPublicacion(user_id);
            if (!publicacion.validarCamposPublicacion(mTBStock, textBoxDesc, listBoxRubrosFinal))
                return;

            if (Convert.ToInt32(mTBStock.Text) < stockAnterior)
            {
                MessageBox.Show("El stock no puede ser disminuido", "FRBA-Commerce", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }


            SqlConnection con = Program.obtenerConexion();

            //Chequeo si se le va a bloquer el usuario
            SqlCommand checkFacturacion = new SqlCommand("SELECT COUNT(*)" 
			 + " FROM (SELECT fac_Nro FROM Monkey_Coders.Facturas, Monkey_Coders.Publicaciones, Monkey_Coders.Item_factura"
			 + " WHERE fac_forma_pago IS NULL AND fac_usuario_id = " + user_id + " AND itfa_publicacion_id = pub_cod"
			 + " AND itfa_factura_id = fac_Nro AND pub_estado_id = 4 GROUP BY fac_Nro) t ", con);

            
            //Me fijo si esta finalizando una publicación

            if (((Generar_Publicacion.GenerarPublicacion.Estado)comboBoxEstado.SelectedItem).id == 4)
            {
                if (Convert.ToInt32(checkFacturacion.ExecuteScalar()) >= 10)
                {
                    DialogResult = MessageBox.Show("Tiene 10 publicaciónes sin facturar." +
                    "Si continúa, su usuario sera inhabilitado y debera regularizar su situacion con un administrador. \n Desea Continuar?",
                    "FRBA - Commerce",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    if (DialogResult == DialogResult.No)
                        return;
                }

                //Finalizo una subasta, hago el alta en compras de esa subasta
                if (tipo.Equals("Subasta"))
                {

                    
                    //Doy el alta de la compra, el stock en las subastas es fijo, así que dejamos el anterior.
                    //Solo buscamos la ganadora para meterla en la lista de compras.

                    SqlCommand subGanadora = new SqlCommand("SELECT sub_oferta_ganadora_id FROM Monkey_Coders.Subastas WHERE sub_publicacion_id = " + pub_cod , con);
                       Int32 newGanadora = Convert.ToInt32(subGanadora.ExecuteScalar());
                    
                    //Busco al usuario de la ganadora

                    SqlCommand usuarioGanadora = new SqlCommand("SELECT ofe_sub_usuario_id FROM Monkey_Coders.Ofertas_Subasta WHERE ofe_sub_id = " + newGanadora,con);
                        Int32 newUsuarioGanadora = Convert.ToInt32(usuarioGanadora.ExecuteScalar());

                    SqlCommand altaCompra = new SqlCommand("INSERT INTO [Monkey_Coders].Compras (com_publicacion_id, com_fecha, com_usuario_comprador_id, com_cant, com_oferta_sub_ganadora_id) VALUES (@PubID, @Fecha, @UserID, @Cant, @Ganadora)", con);
                    altaCompra.Parameters.Add("PubID", SqlDbType.Int, 18).Value = pub_cod;
                    altaCompra.Parameters.Add("Fecha", SqlDbType.VarChar, 255).Value = Program.FechaActual;
                    altaCompra.Parameters.Add("UserID", SqlDbType.Int, 18).Value = newUsuarioGanadora;
                    altaCompra.Parameters.Add("Cant", SqlDbType.Int, 18).Value = stockAnterior;
                    altaCompra.Parameters.Add("Ganadora", SqlDbType.Int, 18).Value = newGanadora;

                    altaCompra.ExecuteNonQuery();
                    

                }

            }


            

            SqlCommand publicar = new SqlCommand("UPDATE Monkey_Coders.Publicaciones "
    + "SET pub_descripcion = '"+ textBoxDesc.Text
    + "', pub_stock = "+mTBStock.Text
    + ", pub_fecha_inicio = "+mTBFechaInicio.Text
    + ", pub_fecha_venc = "+mTBFechaVencimiento.Text
    + ", pub_precio = " + Convert.ToDouble(mTBPrecio.Text).ToString(System.Globalization.CultureInfo.InvariantCulture)
    + " , pub_tipo = '" + tipo
    + "', pub_preguntas = " + Convert.ToInt32(checkBoxPP.CheckState)
    + ", pub_visibilidad_cod = " +((Generar_Publicacion.GenerarPublicacion.Visibilidad)comboBoxVisib.SelectedItem).id
    + ", pub_estado_id = " + ((Generar_Publicacion.GenerarPublicacion.Estado)comboBoxEstado.SelectedItem).id
    + " WHERE pub_cod = " + pub_cod, con);


            publicar.ExecuteNonQuery();


            borrarRubros();
            agregarRubros();

            formPadre.buscar();

            MessageBox.Show("Modificación Realizada con Éxito");
            this.Close();
        }


        private void agregarRubros()
        {
            SqlConnection con = Program.obtenerConexion();

            foreach (Generar_Publicacion.GenerarPublicacion.Rubro rubro in listBoxRubrosFinal.Items)
            {
                SqlCommand asignarRubros = new SqlCommand("INSERT INTO [Monkey_Coders].Rubros_publicaciones (rp_pub_id, rp_rub_id) VALUES (@publicacion, @rubroID)", con);
                asignarRubros.Parameters.Add("publicacion", SqlDbType.Int, 18).Value = pub_cod;
                asignarRubros.Parameters.Add("rubroID", SqlDbType.Int, 18).Value = rubro.id;
                asignarRubros.ExecuteNonQuery();
            }
        }

        private void borrarRubros()
        {
            SqlConnection con = Program.obtenerConexion();
            
            SqlCommand borrarRubros = new SqlCommand("DELETE FROM Monkey_Coders.Rubros_publicaciones"
            +" WHERE rp_pub_id = " + pub_cod, con);

            borrarRubros.ExecuteNonQuery();
        }

        private void labelAdd_Click(object sender, EventArgs e)
        {
            if (listBoxRubros.SelectedItem != null && !listBoxRubrosFinal.Items.Contains(listBoxRubros.SelectedItem))
            {
                listBoxRubrosFinal.Items.Add(listBoxRubros.SelectedItem);
                listBoxRubros.Items.Remove(listBoxRubros.SelectedItem);
            }
        }

        private void labelRmv_Click(object sender, EventArgs e)
        {
            if (listBoxRubrosFinal.SelectedItem != null && (!listBoxRubros.Items.Contains(listBoxRubrosFinal.SelectedItem)))
            {
                listBoxRubros.Items.Add(listBoxRubrosFinal.SelectedItem);
                listBoxRubrosFinal.Items.Remove(listBoxRubrosFinal.SelectedItem);
            }
        }

        private void mTBPrecio_KeyPress(object sender, KeyPressEventArgs e)
        {
            // allows 0-9, backspace, and decimal
            if (((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != 44))
            {
                e.Handled = true;
                return;
            }

            // checks to make sure only 1 decimal is allowed
            if (e.KeyChar == 44)
            {
                if ((sender as TextBox).Text.IndexOf(e.KeyChar) != -1)
                    e.Handled = true;
            }
        }

        private void mTBFechaInicio_Click(object sender, EventArgs e)
        {
            monthCalendar.Visible = true;
        }

        private void monthCalendar_DateSelected(object sender, DateRangeEventArgs e)
        {
            mTBFechaInicio.Text = monthCalendar.SelectionStart.ToString("dd/MM//yyyy");
            monthCalendar.Visible = false;
            actualizarVencimiento();
        }

        private void comboBoxVisib_SelectedIndexChanged(object sender, EventArgs e)
        {
            actualizarVencimiento();
        }

        public void actualizarVencimiento()
        {
            DateTime fechaInicio, fechaVencimiento;
            fechaInicio = DateTime.ParseExact(mTBFechaInicio.Text, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
            fechaVencimiento = fechaInicio.AddDays(((Generar_Publicacion.GenerarPublicacion.Visibilidad)comboBoxVisib.SelectedItem).duracion);
            mTBFechaVencimiento.Text = fechaVencimiento.ToString();
        }

        private void mTBPrecio_TextChanged(object sender, EventArgs e)
        {

        }


    }
}
